home *** CD-ROM | disk | FTP | other *** search
/ Exame Informatica 139 / Exame Informatica 139.iso / Internet / NVU / chrome / toolkit.jar / content / global / bindings / tabbox.xml < prev    next >
Encoding:
Extensible Markup Language  |  2004-09-01  |  16.6 KB  |  535 lines

  1. <?xml version="1.0"?>
  2.  
  3. <bindings id="tabBindings"
  4.           xmlns="http://www.mozilla.org/xbl"
  5.           xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
  6.           xmlns:xbl="http://www.mozilla.org/xbl">
  7.  
  8.   <binding id="tab-base">
  9.     <resources>
  10.       <stylesheet src="chrome://global/skin/tabbox.css"/>
  11.     </resources>
  12.   </binding>
  13.  
  14.   <binding id="tabbox" display="xul:box"
  15.            extends="chrome://global/content/bindings/tabbox.xml#tab-base">
  16.     <implementation implements="nsIAccessibleProvider">
  17.       <property name="accessible">
  18.         <getter>
  19.           <![CDATA[
  20.             var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService);
  21.             return accService.createXULTabBoxAccessible(this);
  22.           ]]>
  23.         </getter>
  24.       </property>
  25.  
  26.       <property name="handleCtrlTab">
  27.         <setter>
  28.         <![CDATA[
  29.           this.setAttribute("handleCtrlTab", val);
  30.           return val;
  31.         ]]>
  32.         </setter>
  33.         <getter>
  34.         <![CDATA[
  35.           return (this.getAttribute("handleCtrlTab") != "false");
  36.         ]]>
  37.         </getter>
  38.       </property>
  39.       
  40.       <property name="handleCtrlPageUpDown">
  41.         <setter>
  42.         <![CDATA[
  43.           this.setAttribute("handleCtrlPageUpDown", val);
  44.           return val;
  45.         ]]>
  46.         </setter>
  47.         <getter>
  48.         <![CDATA[
  49.           return (this.getAttribute("handleCtrlPageUpDown") != "false");
  50.         ]]>
  51.         </getter>
  52.       </property>
  53.  
  54.       <property name="_tabs">
  55.         <getter>
  56.         <![CDATA[
  57.           var tabs = this.getElementsByTagNameNS(
  58.               "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
  59.               "tabs");
  60.           return tabs.length ? tabs[0] : null;
  61.         ]]>
  62.         </getter>
  63.       </property>
  64.  
  65.       <property name="_tabpanels">
  66.         <getter>
  67.         <![CDATA[
  68.           var tabpanels = this.getElementsByTagNameNS(
  69.               "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
  70.               "tabpanels");
  71.           return tabpanels.length ? tabpanels[0] : null;
  72.         ]]>
  73.         </getter>
  74.       </property>
  75.       
  76.       <property name="selectedIndex"
  77.                 onget="return this._tabs ? this._tabs.selectedIndex : null;">
  78.         <setter>
  79.         <![CDATA[
  80.           if (this._tabs)
  81.             this._tabs.selectedIndex = val;
  82.           return val;
  83.         ]]>
  84.         </setter>
  85.       </property>
  86.  
  87.       <property name="selectedTab"
  88.                 onget="return this._tabs ? this._tabs.selectedItem : null;">
  89.         <setter>
  90.         <![CDATA[
  91.           if (!val)
  92.             throw Components.results.NS_ERROR_NULL_POINTER;
  93.           if (this._tabs)
  94.             this._tabs.selectedItem = val;
  95.           return val;
  96.         ]]>
  97.         </setter>
  98.       </property>
  99.  
  100.       <property name="selectedPanel"
  101.                 onget="return this._tabpanels ? this._tabpanels.selectedPanel : null;">
  102.         <setter>
  103.         <![CDATA[
  104.           if (!val)
  105.             throw Components.results.NS_ERROR_NULL_POINTER;
  106.           if (this._tabpanels)
  107.             this._tabpanels.selectedPanel = val;
  108.           return val;
  109.         ]]>
  110.         </setter>
  111.       </property>
  112.  
  113.       <field name="_keyEventHandler" readonly="true">
  114.       <![CDATA[({
  115.         tabbox: this,
  116.         handleEvent: function handleEvent(event) {
  117.       if (!event.isTrusted) {
  118.         // Don't let untrusted events mess with tabs.
  119.         return;
  120.       }
  121.  
  122.           switch (event.keyCode) {
  123.             case event.DOM_VK_TAB:
  124.               if (event.ctrlKey && !event.altKey && !event.metaKey)
  125.                 if (this.tabbox._tabs && this.tabbox.handleCtrlTab) {
  126.                   this.tabbox._tabs.advanceSelectedTab(event.shiftKey ? -1 : 1);
  127.                   event.stopPropagation();
  128.                   event.preventDefault();
  129.                 }
  130.               break;
  131.             case event.DOM_VK_PAGE_UP:
  132.               if (event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey)
  133.                 if (this.tabbox._tabs && this.tabbox.handleCtrlPageUpDown) {
  134.                   this.tabbox._tabs.advanceSelectedTab(-1);
  135.                   event.stopPropagation();
  136.                   event.preventDefault();
  137.                 }
  138.               break;
  139.             case event.DOM_VK_PAGE_DOWN:
  140.               if (event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey)
  141.                 if (this.tabbox._tabs && this.tabbox.handleCtrlPageUpDown) {
  142.                   this.tabbox._tabs.advanceSelectedTab(1);
  143.                   event.stopPropagation();
  144.                   event.preventDefault();
  145.                 }
  146.               break;
  147.           }
  148.         }
  149.       })]]>
  150.       </field>
  151.  
  152.       <field name="_eventNode">this</field>
  153.  
  154.       <property name="eventNode" onget="return this._eventNode;">
  155.         <setter>
  156.           <![CDATA[
  157.             if (val != this._eventNode) {
  158.               val.addEventListener("keypress", this._keyEventHandler, true);
  159.               this._eventNode.removeEventListener("keypress", this._keyEventHandler, true);
  160.               this._eventNode = val;
  161.             }
  162.             return val;
  163.           ]]>
  164.         </setter>
  165.       </property>
  166.  
  167.       <constructor>
  168.         switch (this.getAttribute("eventnode")) {
  169.           case "parent": this._eventNode = this.parentNode; break;
  170.           case "window": this._eventNode = window; break;
  171.           case "document": this._eventNode = document; break;
  172.         }
  173.         this._eventNode.addEventListener("keypress", this._keyEventHandler, true);
  174.       </constructor>
  175.  
  176.       <destructor>
  177.         this._eventNode.removeEventListener("keypress", this._keyEventHandler, true);
  178.       </destructor>
  179.     </implementation>
  180.   </binding>
  181.  
  182.   <binding id="tabs" display="xul:box"
  183.            extends="chrome://global/content/bindings/tabbox.xml#tab-base">
  184.     <content>
  185.       <xul:spacer class="tabs-left"/>
  186.       <children/>
  187.       <xul:spacer class="tabs-right" flex="1"/>
  188.     </content>
  189.     
  190.     <implementation implements="nsIDOMXULSelectControlElement, nsIAccessibleProvider">
  191.       <constructor>
  192.       <![CDATA[
  193.         // first and last tabs need to be able to have unique styles
  194.         // and also need to select first tab on startup.
  195.         if (this.firstChild)
  196.           this.firstChild.setAttribute("first-tab", "true");
  197.         if (this.lastChild)
  198.           this.lastChild.setAttribute("last-tab", "true");
  199.         this.selectedIndex = 0;
  200.         var o = this.getAttribute("orient");
  201.         if (!o)
  202.           this.setAttribute("orient", "horizontal");
  203.       ]]>
  204.       </constructor>
  205.       
  206.       <property name="accessible">
  207.         <getter>
  208.           <![CDATA[
  209.             var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService);
  210.             return accService.createXULTabsAccessible(this);
  211.           ]]>
  212.         </getter>
  213.       </property>
  214.  
  215.       <property name="selectedIndex">
  216.         <getter>
  217.         <![CDATA[
  218.           const tabs = this.childNodes;
  219.           for (var i = 0; i < tabs.length; i++) {
  220.             if (tabs[i].selected)
  221.               return i;
  222.           }
  223.           // throw an exception when no tab is selected (we shouldn't get here)
  224.           throw Components.results.NS_ERROR_FAILURE;
  225.         ]]>
  226.         </getter>
  227.         
  228.         <setter>
  229.         <![CDATA[
  230.           const tabs = this.childNodes;
  231.           if (0 <= val && val < tabs.length && !tabs[val].selected) {
  232.  
  233.             for (var i = 0; i < tabs.length; i++)
  234.               if (i != val && tabs[i].selected)
  235.                 tabs[i].selected = false;
  236.  
  237.             tabs[val].selected = true;
  238.   
  239.             for (var parent = this.parentNode; parent; parent = parent.parentNode) {
  240.               if (parent.localName == 'tabbox') {
  241.                 var tabpanels = parent._tabpanels;
  242.                 // This will cause an onselect event to fire for the tabpanel element.
  243.                 if (tabpanels) {
  244.                   // find an id 
  245.                   var linkedPanelId = tabs[val].linkedPanel;
  246.                   var linkedPanel = linkedPanelId ? document.getElementById(linkedPanelId) : null;
  247.                   if (linkedPanel)
  248.                     tabpanels.selectedPanel = linkedPanel;
  249.                   else
  250.                     tabpanels.selectedIndex = val;
  251.                 }
  252.                 break;
  253.               }
  254.             }
  255.             
  256.             // Fire an onselect event for the tabs element.
  257.             var event = document.createEvent('Events');
  258.             event.initEvent('select', false, true);
  259.             this.dispatchEvent(event);
  260.           }
  261.           return val;
  262.         ]]>
  263.         </setter>
  264.       </property>
  265.  
  266.       <property name="selectedItem">
  267.         <getter>
  268.         <![CDATA[
  269.           const tabs = this.childNodes;
  270.           for (var i = 0; i < tabs.length; i++) {
  271.             if (tabs[i].selected)
  272.               return tabs[i];
  273.           }
  274.           // throw an exception when no tab is selected (we shouldn't get here)
  275.           throw Components.results.NS_ERROR_FAILURE;
  276.         ]]>
  277.         </getter>
  278.         
  279.         <setter>
  280.         <![CDATA[
  281.           if (!val)
  282.             throw Components.results.NS_ERROR_NULL_POINTER;
  283.           if (!val.selected) {
  284.             const tabs = this.childNodes;
  285.             for (var i = 0; i < tabs.length; i++)
  286.               if (tabs[i] == val)
  287.                 this.selectedIndex = i;
  288.           }
  289.           return val;
  290.         ]]>
  291.         </setter>
  292.       </property>
  293.     
  294.       <method name="advanceSelectedTab">
  295.         <parameter name="aDir"/>
  296.         <body>
  297.         <![CDATA[
  298.           var startTab = this.selectedItem;
  299.           var next = startTab[aDir == -1 ? "previousSibling" : "nextSibling"];
  300.  
  301.           while (next != startTab && (!next || next.getAttribute("hidden"))) {
  302.             if (next && next.getAttribute("hidden"))
  303.               next = next[aDir == -1 ? "previousSibling" : "nextSibling"];
  304.             if (!next)
  305.               next = aDir == 1 ? this.childNodes[0] : this.childNodes[this.childNodes.length - 1];
  306.           }
  307.  
  308.           if (next && next != startTab) {
  309.             this.selectedItem = next;
  310.             if (this.getAttribute("setfocus") != "false") {
  311.               next.focus();
  312.               document.commandDispatcher.advanceFocusIntoSubtree(next);
  313.             }
  314.           }
  315.         ]]>
  316.         </body>
  317.       </method>
  318.  
  319.       <method name="appendItem">
  320.         <parameter name="label"/>
  321.         <parameter name="value"/>
  322.         <body>
  323.         <![CDATA[
  324.           var XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  325.           var tab = document.createElementNS(XULNS, "tab");
  326.           tab.setAttribute("label", label);
  327.           tab.setAttribute("value", value);
  328.           this.appendChild(tab);
  329.           return tab;
  330.         ]]>
  331.         </body>
  332.       </method>
  333.       
  334.       <method name="insertItemAt">
  335.         <parameter name="index"/>
  336.         <parameter name="label"/>
  337.         <parameter name="value"/>
  338.         <body>
  339.         <![CDATA[
  340.           var XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  341.           var tab = document.createElementNS(XULNS, "tab");
  342.           tab.setAttribute("label", label);
  343.           tab.setAttribute("value", value);
  344.           var before = this.childNodes[index];
  345.           if (before)
  346.             this.insertBefore(tab, before);
  347.           else
  348.             this.appendChild(tab);
  349.           return tab;
  350.         ]]>
  351.         </body>
  352.       </method>
  353.  
  354.       <method name="removeItemAt">
  355.         <parameter name="index"/>
  356.         <body>
  357.         <![CDATA[
  358.           var remove = this.childNodes[index];
  359.           if (remove)
  360.             this.removeChild(remove);
  361.           return remove;
  362.         ]]>
  363.         </body>
  364.       </method>
  365.     </implementation>
  366.   </binding>
  367.   
  368.   <binding id="tabs-closebutton" 
  369.            extends="chrome://global/content/bindings/tabbox.xml#tabs">
  370.     <content>
  371.       <xul:hbox flex="1" style="min-width: 1px;">
  372.         <children/>
  373.         <xul:spacer class="tabs-right" flex="1"/>
  374.       </xul:hbox>
  375.       <xul:stack>
  376.         <xul:spacer class="tabs-right"/>
  377.         <xul:hbox class="tabs-closebutton-box" align="center" pack="end">
  378.           <xul:toolbarbutton ondblclick="event.preventBubble();" class="tabs-closebutton close-button" xbl:inherits="disabled=disableclose,oncommand=onclosetab"/>
  379.         </xul:hbox>
  380.       </xul:stack>
  381.     </content>
  382.   </binding>
  383.   
  384.   <binding id="tabpanels"
  385.            extends="chrome://global/content/bindings/tabbox.xml#tab-base">
  386.     <implementation implements="nsIAccessibleProvider">
  387.       <property name="accessible">
  388.         <getter>
  389.           <![CDATA[
  390.             var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService);
  391.             return accService.createXULTabPanelsAccessible(this);
  392.           ]]>
  393.         </getter>
  394.       </property>
  395.  
  396.       <field name="_selectedPanel">null</field>
  397.  
  398.       <property name="selectedIndex">
  399.         <getter>
  400.         <![CDATA[
  401.           var indexStr = this.getAttribute("selectedIndex");
  402.           return indexStr ? parseInt(indexStr) : -1;
  403.         ]]>
  404.         </getter>
  405.                         
  406.         <setter>
  407.         <![CDATA[
  408.           var panel = this._selectedPanel;
  409.           this._selectedPanel = this.childNodes[val];
  410.           this.setAttribute("selectedIndex", val);
  411.           if (this._selectedPanel != panel) {
  412.             var event = document.createEvent("Events");
  413.             event.initEvent("select", false, true);
  414.             this.dispatchEvent(event);
  415.           }
  416.           return val;
  417.         ]]>
  418.         </setter>
  419.       </property>
  420.  
  421.  
  422.       <property name="selectedPanel">
  423.         <getter>
  424.           <![CDATA[
  425.             return this._selectedPanel;
  426.           ]]>
  427.         </getter>
  428.  
  429.         <setter>
  430.           <![CDATA[
  431.             var selectedIndex = -1;
  432.             for (var panel = val; panel != null; panel = panel.previousSibling)
  433.               ++selectedIndex;
  434.             this.selectedIndex = selectedIndex;
  435.             return val;
  436.           ]]>
  437.         </setter>
  438.       </property>
  439.     </implementation>
  440.   </binding>
  441.  
  442.   <binding id="tab" display="xul:button"
  443.            extends="chrome://global/content/bindings/tabbox.xml#tab-base">
  444.     <content>
  445.       <xul:image class="tab-icon" xbl:inherits="validate,src=image"/>
  446.       <xul:label class="tab-text" xbl:inherits="value=label,accesskey,crop,disabled" flex="1"/>
  447.     </content>
  448.     
  449.     <implementation implements="nsIDOMXULSelectControlItemElement, nsIAccessibleProvider">
  450.       <property name="accessible">
  451.         <getter>
  452.           <![CDATA[
  453.             var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService);
  454.             return accService.createXULTabAccessible(this);
  455.           ]]>
  456.         </getter>
  457.       </property>
  458.  
  459.       <property name="label">
  460.         <getter>
  461.           return this.getAttribute("label");
  462.         </getter>
  463.         <setter>  
  464.           this.setAttribute("label", val);
  465.           return val;
  466.         </setter>
  467.       </property>
  468.  
  469.       <property name="tabs" 
  470.                 onget="return this.getAttribute('tabs');"
  471.                 onset="this.setAttribute('tabs', val); return val;"/>
  472.  
  473.       <!-- XXX -->                
  474.       <property name="selected">
  475.         <getter>
  476.           return this.getAttribute("selected") == "true" ? true : false;
  477.         </getter>
  478.         <setter>
  479.           this.setAttribute("selected", val);
  480.           if (this.previousSibling) {
  481.             if (val)
  482.               this.previousSibling.setAttribute("beforeselected", val);
  483.             else
  484.               this.previousSibling.removeAttribute("beforeselected");
  485.           }
  486.           if (this.nextSibling) {
  487.             if (val)
  488.               this.nextSibling.setAttribute("afterselected", val);
  489.             else
  490.               this.nextSibling.removeAttribute("afterselected");
  491.           }
  492.           return val;
  493.         </setter>
  494.       </property>
  495.  
  496.       <property name="linkedPanel" onget="return this.getAttribute('linkedpanel')"
  497.                                    onset="this.setAttribute('linkedpanel', val); return val;"/>
  498.     </implementation>
  499.     
  500.     <handlers>
  501.       <handler event="click" button="0">
  502.       <![CDATA[
  503.         this.parentNode.selectedItem = this;
  504.       ]]>
  505.       </handler>
  506.       
  507.       <handler event="keypress" keycode="vk_left">
  508.       <![CDATA[
  509.         this.parentNode.advanceSelectedTab(-1);
  510.       ]]>
  511.       </handler>
  512.       
  513.       <handler event="keypress" keycode="vk_right">
  514.       <![CDATA[
  515.         this.parentNode.advanceSelectedTab(1);
  516.       ]]>
  517.       </handler>
  518.       
  519.       <handler event="keypress" keycode="vk_up">
  520.       <![CDATA[
  521.         this.parentNode.advanceSelectedTab(-1);
  522.       ]]>
  523.       </handler>
  524.       
  525.       <handler event="keypress" keycode="vk_down">
  526.       <![CDATA[
  527.         this.parentNode.advanceSelectedTab(1);
  528.       ]]>
  529.       </handler>
  530.     </handlers>
  531.   </binding>
  532.   
  533. </bindings>
  534.  
  535.